package systemScale;

/**
 * 
 *


 int类型能表示的最大正数
 MAX_VALUE = 0x7fffffff
 最大正数是毫无疑问，所以还是0111 1111 1111 1111 1111 1111 1111 1111，也是2^31 - 1


 int类型能表示的最小负数
 MIN_VALUE = 0x80000000
 最小的负数的二进制码是1000 0000 0000 0000 0000 0000 0000 0000 ，补码还是这个值，所以最小值为-2^31


 重要的性质最大值+1
 (max + 1 == min) is true.
 (min - 1 == max) is ture.

 最大值的二进制补码表示 0111 1111 1111 1111 1111 1111 1111 1111，加1后称为 1000 0000 0000 0000 0000 0000 0000 0000
 * @author zyj
 *  2017-12-27 13:43:36
 *
 */
public class BigSmallSymbol {
	public static void main(String[] args) {
		//当超过正整数最大值时。 >>> 正确。 >> 错误。
		int res = (Integer.MAX_VALUE - 10 + Integer.MAX_VALUE - 10) >>> 1; //已经越界。成为负数。>>> 无符号右移
		int res2 = (Integer.MAX_VALUE - 10 + Integer.MAX_VALUE - 10) >> 1;//-11 .错误。
		System.out.println("BigSmallSymbol:main:MAX_VALUE:"+Integer.MAX_VALUE);
		System.out.println("BigSmallSymbol:main: src > over Max >>>:"+res);
		System.out.println("BigSmallSymbol:main: src > over Max >>:"+res2);

		//当超过 min 最小值时。 >>> >> 错误。
		int resMin = (Integer.MIN_VALUE + 10 + Integer.MIN_VALUE + 10) >>> 1; //10 。错误 。因为 正整数 >>> 是正整数。
		int resMin2 = (Integer.MIN_VALUE + 10 + Integer.MIN_VALUE + 10) >> 1;//10	。错误。因为 正整数 >>> 是正整数。

		//分别 >> 。正确。
		int resMin3 = (Integer.MIN_VALUE >> 2) + (10 >>1) + (Integer.MIN_VALUE >>2) + (10>>1) ;//-1073741824 正确。
		System.out.println("BigSmallSymbol:main:resMin3: 分别>>:"+resMin3);//-1073741814 正确。

		System.out.println("BigSmallSymbol:main:resMin:"+resMin);
		System.out.println("BigSmallSymbol:main:resMin2:"+resMin2);

		System.out.println("BigSmallSymbol:main:( - 4 >> 1)::"+( - 4 >> 1));//-2
		System.out.println("BigSmallSymbol:main:( - 16 >> 1)::"+( - 16 >> 1));//-8


		System.out.println("BigSmallSymbol:main:  Integer.MIN_VALUE >> 1:"+(Integer.MIN_VALUE >> 1 ));// -1073741824 .正确。

		System.out.println("BigSmallSymbol:main:resMin4:"+(Integer.MIN_VALUE + 10));//-2147483638

		//MIN -1 <-> MAX + 1
		System.out.println("BigSmallSymbol:main:  max + 1 == min:"+(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE));//true
		System.out.println("BigSmallSymbol:main:  min - 1 == max:"+(Integer.MIN_VALUE - 1 == Integer.MAX_VALUE));//true



	}

	/**
	  * 输出一个int的二进制数
	   * @param num
	   */
	private static void printNumtoBinarry(int num) {
		System.out.println(Integer.toBinaryString(num));
	}
}
